/**
 * [189] 轮转数组
 *
 * @format
 * @lc app=leetcode.cn id=189 lang=javascript
 */

// @lc code=start
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */
// 互换
// var rotate = function (nums, k) {
//     const N = nums.length
//     k %= N
//     if (k == 0) return 0
//     // k >= n / 2 ? (n = k) : (n -=k)
//     const REST = N % k
//     let count = N
//     REST == 0 ? (count -= k) : count--
//     // console.log(k, count, nums)
//     for (let i = 0; i < count; i++) {
//         let j = 0
//         if (i >= N - REST) j = N - 1
//         else j = N - k + (i % k)
//         ;[nums[i], nums[j]] = [nums[j], nums[i]]
//         // console.log(i, j, nums)
//     }
// }
// 跳跃（环状替换）
// var rotate = function (nums, k) {
//     const N = nums.length
//     // divisible
//     const D = N % k == 0
//     let [i, temp, count] = [0, nums[0], 0]
//     while (count < N) {
//         if (D && k != 1 && count != 1 && N % count == 0) {
//             i = (i + 1) % N
//             temp = nums[i]
//         }
//         i = (i + k) % N
//         ;[temp, nums[i]] = [nums[i], temp]
//         count++
//         // console.log(`i: ${i},count: ${count},temp: ${temp}`)
//         // console.log("nums:", nums)
//     }
// }
// 辅助空间（额外数组）
// var rotate = function (nums, k) {
//     const N = nums.length
//     // k %= N
//     const arr = new Array(N)
//     // for (let i = 0; i < N; i++) arr[i] = nums[(N - k + i) % N]
//     for (let i = 0; i < N; i++) arr[(i + k) % N] = nums[i]
//     for (let i = 0; i < N; i++) nums[i] = arr[i]
// }
// debugger
// const nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]
// let k = 38
// const nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
// let k = 8
// rotate(nums, k)
// debugger
// @lc code=end
